package cn.edu.swu.miniwebsvr.core;

import cn.edu.swu.miniwebsvr.handler.DefaultHandler;
import java.io.IOException;
import java.io.OutputStream;
import java.nio.charset.StandardCharsets;

//路由处理器，负责根据请求的URL匹配对应的处理器(Handler)
public class Router {
     // 根据请求的URL路由到对应的处理器
     // @param request 请求参数对象，包含URL等请求信息
     // @param response 响应输出流，用于向客户端发送响应
    public void route(Parameter request, OutputStream response) throws IOException {
        // 获取配置单例对象，配置中存储了URL与Handler的映射关系
        Config config = Config.getInstance();

        // TODO: [222024321072057/王文薏] 根据请求的URL获取Handler
        Handler handler = config.getHandler(request.getUrl());

        if (handler == null) {
            // 如果没有匹配的路由，尝试使用默认路由"/"对应的Handler
            handler = new DefaultHandler();
        }

        if (handler != null) {
            // 如果找到处理器，则调用其handle方法处理请求
            handler.handle(request, response);
        } else {
            // TODO: [222024321072057/王文薏] 如果连DefaultHandler都没有，返回500 Internal Server Error
            // 当既无匹配处理器也无默认处理器时，返回服务器内部错误
            try {
                String errorMsg = "HTTP/1.1 500 Internal Server Error\r\n" +
                        "Content-Type: text/plain\r\n" +
                        "Content-Length: 34\r\n" +
                        "\r\n" +
                        "No available handler found for the request";
                response.write(errorMsg.getBytes(StandardCharsets.UTF_8));
                response.flush();
            } catch (IOException e) {
                System.err.println("Failed to send 500 error response: " + e.getMessage());
            }
         }
        // 确保响应刷新到客户端（无论是否发生异常，最终都会执行）
        response.flush();
    }
}
